(function(window, document, undefined) {
    "use strict";

    // 引入module
    var system = require('system'), // 获取参数
        path = phantom.libraryPath;

    /**
     * phantomJs 全局异常监听
     * @param msg
     * @param trace
     */
    phantom.onError = function (msg, trace) {
        var msgStack = ['Convert ERROR: ' + msg];
        if (trace && trace.length) {
            msgStack.push('TRACE:');
            trace.forEach(function (t) {
                msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function + ')' : ''));
            });
        }
        console.log(msgStack.join('\n'));
        phantom.exit(1);
    };

    // ***********************************
    // Echarts转换器
    // ***********************************
    function Convert(params) {
        this.params = params; // 参数命令
        this.external = {
            ECHARTS3: path + '/script/echarts.min.js',
        }; // 外部js
    }

    /**
     * 初始化
     */
    Convert.prototype.init = function () {
        var params = this.parseArgs(this.params);
        this.check(params);
        this.client(JSON.parse(params.opt));
    };

    /**
     * 解析参数
     */
    Convert.prototype.parseArgs = function(args) {
        var Base64 = require( path + '/script/base64util.js');
        var obj = {};
        if(args.length > 1) {
            obj['opt'] = Base64.decode(args[1]);
        }
        return obj;
    };

    /**
     * 参数检查
     * @param params
     */
    Convert.prototype.check = function (params) {
        if (undefined === params.opt) {
            this.error("option argument missing -o, --opt <json>");
        }else {
            var isJson = this.checkJson(params.opt);
            if (!isJson) {
                this.error("--opt <json> args not json string");
            }
        }
    };

    /**
     * 检查是否是json字符串
     * @param value
     * @returns {boolean}
     */
    Convert.prototype.checkJson = function (value) {
        var re = /^\{[\s\S]*\}$|^\[[\s\S]*\]$/;
        // 类型为string
        if (typeof value !== 'string') {
            return false;
        }
        // 正则验证
        if (!re.test(value)) {
            return false;
        }
        // 是否能解析
        try {
            JSON.parse(value);
        } catch (err) {
            return false;
        }
        return true;
    };

    /**
     * 访问渲染
     * @param params
     * @param fn
     */
    Convert.prototype.client = function (option) {
        var page = require('webpage').create(); // 客户端
        var convert = this,
            external = this.external,
            output,
            outputPath = path + '/tmp/' + new Date().getTime() + '.png';

        /**
         * 输出
         * @param content 内容
         * @param success 是否成功
         */
        output = function (content, success, msg) {
            console.log(success ? "[SUCCESS]:" : "[ERROR]:" + content);
            page.close();
            convert.exit(params);// exit
        };

        /**
         * 页面console监听
         * @param msg
         * @param lineNum
         * @param sourceId
         */
        page.onConsoleMessage = function (msg, lineNum, sourceId) {
            console.log(msg);
        };

        /**
         * 页面错误监听
         * @param msg
         * @param trace
         */
        page.onError = function (msg, trace) {
            output('', false, msg); // 失败,返回错误信息
        };

        // 空白页
        page.open("about:blank", function (status) {
            // 注入依赖js包
            var hasEchart = page.injectJs(external.ECHARTS3);

            // 检查js是否引用成功
            if (!hasEchart) {
                output("Could not found " + external.ECHARTS3, false);
            }

            // 创建echarts
            page.evaluate(createEchartsDom, option);
            // 定义剪切范围，如果定义则截取全屏
            page.clipRect = {
                top: 0,
                left: 0,
                width: '100%',
                height: '100%'
            };
            page.render(outputPath);
            convert.exit();
        });
    };
    
    /**
     * 创建eCharts Dom层
     * @param params 参数
     */
    function createEchartsDom(options) {
        // 取消动画,否则生成图片过快，会出现无数据
        if (options !== undefined) {
            options.animation = false;
        }

        // body背景设置为白色
        document.body.style.background = '#fff';
        var container = document.createElement('div');
        container.id = 'container';
        container.style.width = '100%';
        container.style.height = '100%';
        document.body.appendChild(container);

        var eChart = echarts.init(container);
        eChart.setOption(options);
        return eChart.getDataURL();
    }

    /**
     * 错误信息打印并退出
     * @param str 错误信息
     */
    Convert.prototype.error = function (str) {
        console.log("Error:" + str);
        phantom.exit();
    };

    /**
     * 退出
     */
    Convert.prototype.exit = function () {
        phantom.exit();
    };

    // 构建,入口
    new Convert(system.args).init();
}());